﻿#ifndef OUTPUTPDF_H
#define OUTPUTPDF_H


#include <QObject>        
#include <QTextOption>                      // 提供文本输出选项的设置
#include <QtPrintSupport/QPrinter>          // 提供打印功能支持
#include <QtPrintSupport/QtPrintSupport>    // 提供打印相关的扩展功能
#include <QMutex>                           // 提供互斥锁功能，用于线程同步
#include <QStringList>                      // 提供字符串列表功能，用于管理字符串集合


// 前向声明
class QPdfWriter;
class QPainter;
class QFile;
class QFont;

/**
 * @brief OutputPDF 类用于将数据或图片保存为PDF文件
 * 
 * 这个类提供了将文本数据和图片保存为PDF文件的功能，支持设置文本对齐方式、
 * 换行模式、字体样式等属性，以及控制分页和行高等。
 */
class OutputPDF
{
public:
    /**
     * @brief 构造函数
     * @param path PDF文件保存路径
     * @param path_pixmap 图片PDF保存路径（可选）
     */
    OutputPDF(const QString &path, const QString &path_pixmap = "");
    ~OutputPDF();

    /**
     * @brief 将多个图片保存到PDF文件
     * @param pixmap 要保存的图片列表
     * @param pixx 图片宽度
     * @param pixy 图片高度
     */
    void SavePixmapToPDF(const QVector<QPixmap> &pixmap, const int pixx, const int pixy);
    
    /**
     * @brief 将文本数据保存到PDF文件
     * @param context 要保存的文本内容
     */
    void SaveDataToPDF(const QString &context);
    
    /**
     * @brief 设置文本选项（对齐方式和换行模式）
     * @param align 文本对齐方式
     * @param wrapmode 文本换行模式
     */
    void SetTextOption(const Qt::AlignmentFlag align, const QTextOption::WrapMode wrapmode);
    
    /**
     * @brief 设置文本字体样式
     * @param family 字体家族
     * @param size 字体大小
     * @param isbold 是否粗体
     * @param isitalic 是否斜体
     * @param isunderline 是否下划线
     */
    void SetTextFont(const QString &family, const int size, const bool isbold, const bool isitalic, const bool isunderline);
    
    // 设置制表符长度
    inline void SetTabLength(const int len) { m_tablen = len; }
    // 设置行高
    inline void SetRowHeight(const int height) { m_rowheight = height; }
    // 添加新页面（文本模式）
    inline void SetNewPage() { m_pdfwrite->newPage(); m_rowcnt = 0; }
    // 结束PDF绘制（文本模式）
    inline void SetPDFEnd() { m_pdfpainter->end(); }
    // 添加新页面（图片模式）
    inline void SetNewPagePixmap() { m_pdfwrite_pixmap->newPage(); }
    // 结束PDF绘制（图片模式）
    inline void SetPDFEndPixmap() { m_pdfpainter_pixmap->end(); }

private:
    QPdfWriter      *m_pdfwrite;          // PDF写入器（文本模式）
    QPdfWriter      *m_pdfwrite_pixmap;   // PDF写入器（图片模式）
    QPainter        *m_pdfpainter;        // PDF绘图设备（文本模式）
    QPainter        *m_pdfpainter_pixmap; // PDF绘图设备（图片模式）
    QString         m_filepath;           // PDF文件路径（文本）
    QString         m_filepath_pixmap;    // PDF文件路径（图片）
    QTextOption     *m_textoption;        // 文本选项（对齐和换行）
    QFont           *m_font;              // 字体对象
    int             m_tablen;             // 制表符长度
    int             m_rowheight;          // 行高
    int             m_rowcnt;             // 当前行计数
};

/**
 * @brief PdfAPI 类是PDF生成的API接口类
 * 
 * 这是一个单例模式的类，提供了将数据保存为PDF表格的接口，支持多种表格格式，
 * 包括标题、副标题、列名、列宽等设置，并支持纸张方向和页面大小配置。
 */
class PdfAPI : public QObject
{
    Q_OBJECT
private:
    explicit PdfAPI(QObject *parent = 0);
    static PdfAPI *_instance;             // 单例实例
    QStringList html;                     // HTML内容缓存

public:
    /**
     * @brief 获取单例实例
     * @return 返回PdfAPI的单例实例
     */
    static PdfAPI *Instance() {
        static QMutex mutex;
        if (!_instance) {
            QMutexLocker locker(&mutex);
            if (!_instance) {
                _instance = new PdfAPI;
            }
        }
        return _instance;
    }
    
    /**
     * @brief SavePdf 将数据保存成PDF表格（单标题版本）
     * @param fileName 文件名
     * @param title 表格标题
     * @param subTitle 表格副标题
     * @param columnNames 列名列表
     * @param columnWidths 列宽列表
     * @param content 数据内容列表
     * @param landscape 是否横向打印
     * @param check 是否给某列加特殊样式
     * @param pageSize 纸张大小（默认A4）
     */
    void SavePdf(QString fileName, QString title, QString subTitle,
                 QList<QString> columnNames, QList<int> columnWidths,
                 QStringList content, bool landscape, bool check,
                 QPrinter::PageSize pageSize = QPrinter::A4);

    /**
     * @brief SavePdf 将数据保存成PDF表格（双标题版本）
     * @param fileName 文件名
     * @param title 表格标题
     * @param columnNames 列名列表
     * @param subTitle1 第一组副标题列表
     * @param subTitle2 第二组副标题列表
     * @param content 数据内容列表
     * @param landscape 是否横向打印
     * @param check 是否给某列加特殊样式
     * @param pageSize 纸张大小（默认A4）
     */
    void SavePdf(QString fileName, QString title,
                 QList<QString> columnNames, QList<int> columnWidths,
                 QStringList subTitle1, QStringList subTitle2,
                 QStringList content, bool landscape, bool check,
                 QPrinter::PageSize pageSize = QPrinter::A4);

};

#endif // OUTPUTPDF_H
